package com.example.algorithm.model;

/**
 * @auth Administrator
 * @create @2025/4/21@21:14
 * @decription
 * No.622 设计CircularQueue（难度：中等）
 * 设计你的循环队列实现。
 * 循环队列是一种线性数据结构，其操作表现基于 FIFO（先进先出）原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
 * 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里，一旦一个队列满了，我们就不能插入下一个元素，即使在队列前面仍有空间。但是使用循环队列，我们能使用这些空间去存储新的值。
 * 你的实现MyCircularQueue类应该支持如下操作：
 * MyCircularQueue(k)
 * : 构造器，设置队列长度为 k 。
 * Front
 * : 从队首获取元素。如果队列为空，返回 -1 。
 * Rear
 * : 获取队尾元素。如果队列为空，返回 -1 。
 * enQueue(value)
 * : 向循环队列插入一个元素。如果成功插入则返回真。
 * deQueue()
 * : 从循环队列中删除一个元素。如果成功删除则返回真。
 * isEmpty()
 * : 检查循环队列是否为空。
 * isFull()
 * : 检查循环队列是否已满。
 *
 **/
public class MyCircleQueue {

    /**
     * 元素数组
     */
    private int[] elements;

    /**
     * 头与尾部位置及总数量
     */
    private int head=0,tail=-1,count=0;


    /**
     *  构造器，设置队列长度为 k 。
     * @param k
     */
    public MyCircleQueue(int k){
        elements = new int[k];
    }

    /**
     * 从队首获取元素。如果队列为空，返回 -1 。
     * @return
     */
    public  int Front(){
        if(count==0){
            return -1;
        }
        return elements[head];
    }

    /**
     * 获取队尾元素。如果队列为空，返回 -1 。
     * @return
     */
    public  int Rear(){
        if(count==0){
            return -1;
        }
        return elements[tail];
    }

    /**
     * 向循环队列插入一个元素。如果成功插入则返回真。
     * @param value
     * @return
     */
    public  boolean enQueue(int value){
        if(isFull()){
            return false;
        }
        tail+=1;
        if(tail==elements.length){
            tail=0;
        }
        elements[tail]=value;
        count++;
        return true;
    }

    /**
     * 从循环队列中删除一个元素。如果成功删除则返回真。
     * @return
     */
    public  boolean deQueue(){
       if(isEmpty()){
           return false;
       }
       elements[head++]=-1;
       if(head==elements.length)
       {
           head=0;
       }
       count--;
       return true;

    }

    /**
     * 检查循环队列是否为空。
     * @return
     */
    public  boolean isEmpty(){
        return count==0;
    }

    /**
     * 检查循环队列是否已满。
     * @return
     */
    public  boolean isFull(){
        return count== elements.length;
    }
}
